<?php

require_once 'Framework/Controller/Action.php';

/**
 * Действия с другими пользователями
 *
 */
class AnotherController extends Framework_Controller_Action
{
    /**
     * Просматриваемый пользователь
     *
     * @var obj User_Another
     */
    private $_anotherUser;
    
    /**
     * Я
     *
     * @var obj User_Self
     */
    private $_user;
    
    /**
     * Тексты
     *
     * @var obj Framework_Config
     */
    private $_messages;
    
    const TETATET = 10;
    
    /*
     * Запись из базы соотвествующая User_Another
     */
    private $_data = array();
    
    public function init()
    {
        $this->session->set('http_referer', $this->getRequest()->getServer('REDIRECT_URL'));
        
    	$this->_messages = Framework_Registry::get('messages');
    	
        // Если не передан user_id($this->_args[0])
        if (!($user_id = $this->_getParam(0))) {
            $this->_redirect('/index/error');
        }
        // Авторизирован ли пользователь?
        if ($this->session->get('logged_in')) {
            // Если хочет сам себя посмотреть
            if ($this->session->get('user_id') == $user_id) {
                $this->_redirect('/profile/');
            }
            $this->_user = new User_Self($this->session->get('user_id'));
            Room::clean($this->session->get('user_id'));
        } elseif ($this->session->get('guest_logged_in')) {
            // Гость
            $this->view->guest = 1;
        } else {
        	// Не авторизирован
        	$this->view->not_auth = 1;
        }

        $this->_anotherUser = new User_Another($user_id);
        $this->_data = $this->_anotherUser->getAllData();
        
        // Пользователя с таким user_id не существует
        if (!is_array($this->_data) || !sizeof($this->_data)) {
            $this->_redirect('/index/error/');
        }

        $this->view->data = $this->_data;
    }
    
    /**
     * Варианты взаимодействия с пользователем
     *
     */
    public function indexAction()
    {
        // Голосовать может только logged_in пользователь
        if ($rating = $this->getRequest()->rating) {
            $this->_notLoggedRedirect();
        }
        // Авторизирован ли пользователь?
        if ($this->session->get('logged_in')) {
            // Записываемся в посетителей анкеты
            $this->_anotherUser->setVisitor($this->session->get('user_id'));
            // Голосовали ли за него или нет
            $voting = $this->_user->isVote($this->_anotherUser->getUserId());
            $this->view->voting = $voting;
            
            if ($rating && $rating == intval($rating) && !$voting) { // голосуем
                $this->_user->vote($this->_anotherUser->getUserId(), $rating);
                $this->view->voting = 1;
                
                $this->_redirect('/another/index/' . $this->_anotherUser->getUserId() . '/');
            }
            $this->view->block  = $this->_user->isBlock($this->_anotherUser->getUserId());
            $this->view->friend = $this->_user->isFriend($this->_anotherUser->getUserId());
        }
        $this->session->set('another_user_id', $this->_anotherUser->getUserId());
        
        $this->render();
    }
    
    /**
     * Профайл
     *
     */
    public function profileAction()
    {   
        if ($this->session->get('logged_in')) {
            // Голосовали ли за него или нет
            $voting = $this->_user->isVote($this->_anotherUser->getUserId());
            $this->view->voting = $voting;
        }
        $this->render();
    }
    
    /**
     * Добавить в друзья
     *
     */
    public function addfriendAction()
    {
        $this->_notLoggedRedirect();
        
        $this->_user->addFriend($this->_anotherUser->getUserId());
        $this->_redirect('/another/index/' . $this->_anotherUser->getUserId() . '/');
    }
    
    /**
     * Удалить из друзей
     *
     */
    public function delfriendAction()
    {
        $this->_notLoggedRedirect();
        
        $this->_user->delFriend($this->_anotherUser->getUserId());
        $this->_redirect('/another/index/' . $this->_anotherUser->getUserId() . '/');
    }
    
    /**
     * Добавить в black list
     *
     */
    public function addblackAction()
    {
        $this->_notLoggedRedirect();
        
        $this->_user->addToBlackList($this->_anotherUser->getUserId());
        $this->_redirect('/another/index/' . $this->_anotherUser->getUserId() . '/');
    }
    
    /**
     * Удалить из black list
     *
     */
    public function delblackAction()
    {
        $this->_notLoggedRedirect();
        
        $this->_user->delFromBlackList($this->_getParam(0));
        $this->_redirect('/another/index/' . $this->_getParam(0) . '/');
    }
    
    /**
     * Настучать на пользователя
     *
     */
    public function abuseAction()
    {
        $this->_notLoggedRedirect();
        
    	if ($this->getRequest()->getMethod() != 'POST') {
            if ($this->session->get('report')) {
            	$this->session->set('report', false);
            	$this->view->abuse = 1;
            }
        } else {
        	if ($message = $this->getRequest()->message) {
        		$this->_user->ReportAbuse($this->_anotherUser->getUserId(), $message);
        		$this->session->set('report', true);
                $this->_redirect('/another/abuse/' . $this->_anotherUser->getUserId() . '/');
        	} else {
        		$this->view->error = $this->_messages->another->empty;
        	}
        }
        
        $this->render();
    }

    /**
     * Приглашение в инвайт
     *
     */
    public function inviteAction()
    {
        $this->_notLoggedRedirect();
        
        $settings = $this->_anotherUser->getSettings();
        
        if (1 == $settings['invite']) { // Работает только если не запрещено настройками
            if ($this->getRequest()->getMethod() != 'POST') { // Not a POST request
                $rooms = $this->_user->getRoomsForInvite($this->_anotherUser->getUserId());
                $this->view->rooms  = $rooms;
                $this->view->invite = $this->session->get('invite');
                $this->session->set('invite', false);
            } else {
                $room_id = $this->getRequest()->getPost('invite');
                if ($this->_anotherUser->setInvite($this->_user->getUserId(), $room_id)) {
                    $form['title']   = $this->_messages->another->inviteTitle;
                    $form['content'] = $this->_messages->another->inviteContent;           
                    $this->_user->sendMessage($this->_anotherUser->getUserId(), $form);
                    $this->session->set('invite', 'true');
                }
    
                $this->_redirect();
            }
        }
        
        $this->render();
    }
    
    /**
     * Отправка сообщения
     *
     */
    public function sendAction()
    {
        $this->_notLoggedRedirect();
        
        if ($this->getRequest()->getMethod() != 'POST') {
            if ($this->session->get('send')) { // Если уже отправили
                $this->session->set('send', false);
                $this->view->send = 1;
            } else { // Если только зашли
                // Ничего не делаем
            }
        } else {
            $form = get_value($this->getRequest()->getPost('form'));
            if ($error = $this->_sendValid($form)) { // Not valid
                $this->view->error = $error;
                $this->view->form  = $form;
            } else {
                if ($this->_user->sendMessage($this->_anotherUser->getUserId(), $form)) { // Если сообщение отправилось
                    $this->session->set('send', true);
                    $this->_redirect();
                } else { // Юзер не добавился в друзья
                    $this->_redirect('/index/error/');
                }
            }
        }
        
        $this->render();
    }
        
    /**
     * Чат вдвоем
     *
     */
    public function tetatetAction()
    {
        $this->_notLoggedRedirect();
        
        $chat = new Chat($this->_user);
        
        if ($this->getRequest()->getMethod() != 'POST') {
            $page = $this->_getParam(1, 0);
            $messages = $chat->getMessages($this->_anotherUser->getUserId(), self::TETATET, $page, $paging);
            $this->view->messages = $messages;
            $this->view->paging   = $paging;
            $this->view->page     = $page;
            
            // Сообщение о начале приватного чата
            $settings = $this->_anotherUser->getSettings();
            $settings['private'] = !isset($settings['private']) ? 1 : $settings['private'];
            if (1 == $this->getRequest()->getQuery('new') && 1 == $settings['private']) {
                // >> Внутренняя почта

                $form['title']   = $this->_messages->another->chatTitle . "({$this->session->get('user_login')})";
                $form['content'] = '<a href="/another/tetatet/' . $this->_user->getUserId() . '/">' . $this->_messages->another->chatContent . '</a>';
                $this->_user->sendMessage($this->_anotherUser->getUserId(), $form, false);
                // <<
                
                // >> Вап пуш
                $meta = Meta::getInstance();
                $data = array('wap_push_url', 'wap_url', 'wap_msisdn', 'wap_message');
                $meta->load($data);
                $url = $meta->get('wap_push_url') . "?"
                     . $meta->get('wap_msisdn') . "=" . $this->_data['user_number'] . "&"
                     . $meta->get('wap_url') . "=" . urlencode($this->getRequest()->getServer('SERVER_NAME') . "/another/tetatet/" . $this->_user->getUserId() . "/") . "&"
                     . $meta->get('wap_message') . "=" . urlencode($form['title']);
                $result = @file_get_contents($url);
                // <<

                $this->_redirect('/another/tetatet/' . $this->_anotherUser->getUserId() . '/');
            }
        } else {
            $message = $this->getRequest()->message;
            $chat->addMessage($this->_anotherUser->getUserId(), $message);
            
            $this->_redirect();
        }
        
        $this->render();
    }
    
    /**
     * Сообщение в приватный чат
     *
     */
    public function writeAction()
    {
        $this->render();
    }
    
    /**
     * Перебрасывание незалогиненных на авторизацию
     *
     */
    private function _notLoggedRedirect()
    {
        // Если не авторизирован то пшел вон
        if (!$this->session->get('logged_in')) {
            $this->_redirect('/user/login/');
        }
    }
    
    /**
     * Валидация формы
     *
     * @param array $form
     * @return array | if $errors not empty
     */
    private function _sendValid($form)
    {
        $errors = array();
        if (empty($form['title']) || empty($form['content'])) {
                $errors['empty'] = $this->_messages->another->empty;;
        }
        if (strlen($form['title']) > 150) {
                $errors['title'] = $this->_messages->another->sendTitle;
        }
        if (strlen($form['content']) > 1000) {
                $errors['message'] = $this->_messages->another->sendMessage;
        }
        if ($this->session->get('user_id') == $this->session->get('send_friend')) {
                $this->_redirect('/index/error/');
        }
        return sizeof($errors) ? $errors : false;
    }
}